#pragma once

#include <utility>
#include <algorithm>
#include <assert.h>
#include <string.h>

class String
{
public:
	String()
		: _data(new char[1])
	{
		*_data = '\0';
	}

	String(const char* str)
		: _data(new char[strlen(str) + 1])
	{
		strcpy(_data, str);
	}

	String(const String& rhs)
		: _data(new char[rhs.size() + 1])
	{
		strcpy(_data, rhs.c_str());
	}

	~String() throw()
	{
		delete[] _data;
	}

	String& operator=(const String& rhs)
	{
		String tmp(rhs);
		swap(tmp);
		return *this;
	}

	// Accessors

	size_t size() const
	{
		return strlen(_data);
	}

	const char* c_str() const
	{
		return _data;
	}

	void swap(String& rhs)
	{
		std::swap(_data, rhs._data);
	}

private:
	char* _data;
};

